package main

import (
	"context"
	"fmt"
	"log"
	"path/filepath"

	"go-file-perception-model/internal/config"
	"go-file-perception-model/internal/logger"
	"go-file-perception-model/internal/repository"
	"go-file-perception-model/pkg/vector"
)

func main() {
	fmt.Println("=== 向量数据库数据验证工具 ===")

	// 初始化日志系统
	logger.InitLogger()

	// 加载配置
	cfg, err := config.LoadConfig()
	if err != nil {
		log.Fatalf("Failed to load config: %v", err)
	}

	// 连接向量数据库 - 使用与主程序相同的逻辑
	var vectorDB *vector.QdrantDB
	vectorDB, err = vector.NewQdrantDBWithAPIKey(cfg.VectorDB.Host, cfg.VectorDB.Port, cfg.VectorDB.APIKey)
	if err != nil {
		fmt.Printf("尝试连接HTTP端口 %d 失败，尝试gRPC端口 %d...\n", cfg.VectorDB.Port, cfg.VectorDB.GRPCPort)
		vectorDB, err = vector.NewQdrantDBWithAPIKey(cfg.VectorDB.Host, cfg.VectorDB.GRPCPort, cfg.VectorDB.APIKey)
		if err != nil {
			log.Fatalf("Failed to connect to vector database: %v", err)
		}
	}

	ctx := context.Background()

	// 首先列出所有现有集合
	fmt.Println("\n=== Qdrant中的所有集合 ===")
	allCollections, err := vectorDB.ListCollections(ctx)
	if err != nil {
		fmt.Printf("❌ 无法列出集合: %v\n", err)
	} else {
		fmt.Printf("找到 %d 个集合:\n", len(allCollections))
		for i, collection := range allCollections {
			fmt.Printf("%d. %s\n", i+1, collection)
			
			// 设置当前集合并计算点数量
			vectorDB.SetCollection(collection)
			count, err := vectorDB.CountPoints(ctx, nil)
			if err != nil {
				fmt.Printf("   错误: 无法计算点数量: %v\n", err)
			} else {
				fmt.Printf("   点数量: %d\n", count)
			}
		}
	}

	// 检查SQLite数据库中的目录信息
	fmt.Println("\n=== SQLite数据库中的目录信息 ===")
	
	cwd, err := filepath.Abs(".")
	if err != nil {
		log.Fatalf("无法获取当前工作目录: %v", err)
	}
	
	dbPath := filepath.Join(cwd, "data", "file_monitor.db")
	fileMonitorRepo, err := repository.NewFileMonitorRepository(dbPath)
	if err != nil {
		log.Fatalf("无法连接SQLite数据库: %v", err)
	}

	directories, err := fileMonitorRepo.ListAllDirectoryRecords()
	if err != nil {
		log.Fatalf("无法获取目录记录: %v", err)
	}

	if len(directories) == 0 {
		fmt.Println("没有找到任何目录记录。")
		return
	}

	fmt.Printf("找到 %d 个目录记录:\n\n", len(directories))
	
	totalVectorPoints := 0
	
	for i, dir := range directories {
		fmt.Printf("目录 %d:\n", i+1)
		fmt.Printf("  路径: %s\n", dir.DirectoryPath)
		fmt.Printf("  集合名称: %s\n", dir.CollectionName)
		fmt.Printf("  总文件数: %d\n", dir.TotalFiles)
		fmt.Printf("  已索引文件数: %d\n", dir.IndexedFiles)
		fmt.Printf("  最后索引时间: %s\n", dir.LastIndexedTime.Format("2006-01-02 15:04:05"))
		
		// 检查向量数据库中对应集合的数据
		fmt.Printf("  向量数据库状态:\n")
		
		// 检查集合是否存在
		exists, err := vectorDB.CollectionExists(ctx, dir.CollectionName)
		if err != nil {
			fmt.Printf("    错误: 无法检查集合是否存在: %v\n", err)
		} else if !exists {
			fmt.Printf("    集合不存在\n")
		} else {
			fmt.Printf("    集合存在\n")
			
			// 设置当前集合并计算点数量
			vectorDB.SetCollection(dir.CollectionName)
			count, err := vectorDB.CountPoints(ctx, nil)
			if err != nil {
				fmt.Printf("    错误: 无法计算点数量: %v\n", err)
			} else {
				fmt.Printf("    向量点数量: %d\n", count)
				totalVectorPoints += int(count)
			}
		}
		
		// 获取该目录下的文件记录
		files, err := fileMonitorRepo.GetFileRecordsByDirectoryID(dir.ID)
		if err != nil {
			fmt.Printf("  错误: 无法获取文件记录: %v\n", err)
		} else {
			fmt.Printf("  SQLite文件记录数: %d\n", len(files))
			indexedCount := 0
			for _, file := range files {
				if file.IsIndexed {
					indexedCount++
				}
			}
			fmt.Printf("  已索引文件记录数: %d\n", indexedCount)
			
			// 显示前5个文件的详细信息
			if len(files) > 0 {
				fmt.Printf("  文件示例:\n")
				maxShow := 5
				if len(files) < maxShow {
					maxShow = len(files)
				}
				for j := 0; j < maxShow; j++ {
					file := files[j]
					status := "未索引"
					if file.IsIndexed {
						status = "已索引"
					}
					fmt.Printf("    %d. %s (%s)\n", j+1, file.FileName, status)
				}
				if len(files) > maxShow {
					fmt.Printf("    ... 还有 %d 个文件\n", len(files)-maxShow)
				}
			}
		}
		
		fmt.Println()
	}

	// 总结
	fmt.Println("=== 总结 ===")
	fmt.Printf("总目录数: %d\n", len(directories))
	fmt.Printf("总向量点数: %d\n", totalVectorPoints)
	
	if totalVectorPoints > 0 {
		fmt.Println("\n✅ 向量数据库中有数据！分块内容已成功存储。")
		fmt.Println("如果您在搜索时遇到问题，请检查:")
		fmt.Println("1. 搜索时是否使用了正确的目录")
		fmt.Println("2. 嵌入模型服务是否正常运行")
		fmt.Println("3. 搜索查询是否与文档内容相关")
	} else {
		fmt.Println("\n❌ 向量数据库中没有数据。")
		fmt.Println("可能的原因:")
		fmt.Println("1. 文件索引过程中出现错误")
		fmt.Println("2. 向量数据库连接问题")
		fmt.Println("3. 嵌入模型服务不可用")
	}
	
	fmt.Println("\n=== 验证完成 ===")
}